﻿using Autofac;
using Autofac.Extras.DynamicProxy;
using HelperCommon.AOP;
using System.Reflection;

namespace DogAPI.Filter
{
    public class AutoFacMoudleReg : Autofac.Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            string basePath = AppDomain.CurrentDomain.BaseDirectory;//获取程序集路径

            //服务Dll路径
            var assemblysRepositoryPath = Path.Combine(basePath, "DogRepository");
            var assemblysServicesPath = Path.Combine(basePath, "DogService");

            builder.RegisterType<LogAOP>();//可以直接替换其他拦截器！一定要把拦截器进行注册
            builder.RegisterType<MemoryAOP>();
            builder.RegisterType<RedisAOP>();

            //注入仓储
            var assemblysRepository = Assembly.LoadFrom(assemblysRepositoryPath);
            builder.RegisterAssemblyTypes(assemblysRepository)
                      .AsImplementedInterfaces()//方法表示将组件以其实现的接口类型进行注册，这样在进行依赖注入时，可以根据接口类型获取相应的实现类
                      .PropertiesAutowired()//方法用于自动装配属性依赖
                      .InstancePerDependency()//方法表示每次请求时都创建一个新的实例。
                      .EnableInterfaceInterceptors()//方法启用接口拦截，使得后续可以对注册的接口进行拦截。
                      .InterceptedBy(typeof(LogAOP),typeof(RedisAOP));//表示使用LogAOP对这些类型的组件进行拦截。

            //注入服务
            var assemblysServices = Assembly.LoadFrom(assemblysServicesPath);
            builder.RegisterAssemblyTypes(assemblysServices)
                      .AsImplementedInterfaces()
                      .InstancePerDependency()
                      .PropertiesAutowired()
                      .EnableInterfaceInterceptors()//方法启用接口拦截，使得后续可以对注册的接口进行拦截。
                      .InterceptedBy(typeof(LogAOP), typeof(RedisAOP));//表示使用LogAOP拦截器对这些类型的组件进行拦截。
        }
    }
}